package cn.iocoder.yudao.module.system.dal.dataobject.useractivity;

import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 用户活跃度统计 DO
 *
 * @author 系统开发团队
 */
@TableName("ai_user_activity_stats")
@KeySequence("ai_user_activity_stats_seq")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserActivityStatsDO extends BaseDO {

    /**
     * 主键ID
     */
    @TableId
    private Long id;

    /**
     * 统计日期
     */
    private LocalDate statDate;

    /**
     * 统计类型：1-日活跃(DAU)，2-周活跃(WAU)，3-月活跃(MAU)
     */
    private Integer statType;

    // ========== 活跃度统计字段 ==========
    /**
     * 总用户数
     */
    private Long totalUsers;

    /**
     * 活跃用户数
     */
    private Long activeUsers;

    /**
     * 新增用户数
     */
    private Long newUsers;

    /**
     * 回访用户数
     */
    private Long returningUsers;

    /**
     * 活跃率（%）
     */
    private BigDecimal activityRate;

    // ========== 登录统计字段 ==========
    /**
     * 登录用户数
     */
    private Long loginUsers;

    /**
     * 总登录次数
     */
    private Long loginTimes;

    /**
     * 平均登录次数
     */
    private BigDecimal avgLoginTimes;

    // ========== 用户类型统计 ==========
    /**
     * 管理员活跃用户数
     */
    private Long adminActiveUsers;

    /**
     * 会员活跃用户数
     */
    private Long memberActiveUsers;

    // ========== 设备统计 ==========
    /**
     * PC端用户数
     */
    private Long pcUsers;

    /**
     * 移动端用户数
     */
    private Long mobileUsers;

    /**
     * Web端用户数
     */
    private Long webUsers;

    // ========== 时间段统计 ==========
    /**
     * 上午活跃用户数(6-12)
     */
    private Long morningUsers;

    /**
     * 下午活跃用户数(12-18)
     */
    private Long afternoonUsers;

    /**
     * 晚上活跃用户数(18-24)
     */
    private Long eveningUsers;

    /**
     * 深夜活跃用户数(0-6)
     */
    private Long nightUsers;

    // ========== 地域统计（前3个地区） ==========
    /**
     * 活跃度最高地区1
     */
    private String topRegion1;

    /**
     * 地区1用户数
     */
    private Long topRegion1Users;

    /**
     * 活跃度最高地区2
     */
    private String topRegion2;

    /**
     * 地区2用户数
     */
    private Long topRegion2Users;

    /**
     * 活跃度最高地区3
     */
    private String topRegion3;

    /**
     * 地区3用户数
     */
    private Long topRegion3Users;

    // ========== 连续活跃统计 ==========
    /**
     * 连续1天活跃用户数
     */
    private Long consecutive1Day;

    /**
     * 连续3天活跃用户数
     */
    private Long consecutive3Days;

    /**
     * 连续7天活跃用户数
     */
    private Long consecutive7Days;

    /**
     * 连续15天活跃用户数
     */
    private Long consecutive15Days;

    /**
     * 连续30天活跃用户数
     */
    private Long consecutive30Days;

    // ========== 计算状态 ==========
    /**
     * 计算状态：0-待计算，1-计算中，2-已完成，3-计算失败
     */
    private Integer calculationStatus;

    /**
     * 计算开始时间
     */
    private LocalDateTime calculationStartTime;

    /**
     * 计算结束时间
     */
    private LocalDateTime calculationEndTime;

    /**
     * 计算耗时（秒）
     */
    private Integer calculationDuration;

    /**
     * 错误信息
     */
    private String errorMessage;

    // ========== 统计类型常量 ==========
    public static final int STAT_TYPE_DAU = 1; // 日活跃
    public static final int STAT_TYPE_WAU = 2; // 周活跃
    public static final int STAT_TYPE_MAU = 3; // 月活跃

    // ========== 计算状态常量 ==========
    public static final int CALCULATION_STATUS_PENDING = 0; // 待计算
    public static final int CALCULATION_STATUS_PROCESSING = 1; // 计算中
    public static final int CALCULATION_STATUS_COMPLETED = 2; // 已完成
    public static final int CALCULATION_STATUS_FAILED = 3; // 计算失败
}